"""
 encoding    : utf-8
 @File       : loggerclass.py
 @Author     : jiahong
 @Version    :1.0
 @Description: 使用方法 实例化之后使用init_logger函数生成日志器对象。将需要记录的信息放入logger.info中：示例，logger.info(变量)
 mode:s f(f,rf,tf):s f 是独立的。可以两个都选（sf）,(f,rf,tf)只能选择一个（srf）. 其中s表示控制台输出日志信息等级位warning，f
 表示文件存储，rf位固定大小文件存储，tf位固定时间文件存储。filename 位文件存储路径。建议使用绝对路径
 @Date       : 2024/06/17
"""
import logging
from logging import handlers
import sys


# 创建一个日志类：实现控制台日志输入和文件日志存储的选择。
class LoggerClass:
    # 初始化日志格式， 模式 ，文件路径，logging模块
    def __init__(self, mode='sf', filename=r'D:\Program Files\PyCharm 2023.3.5\test_oa_sys\log\testlog\test.log'):
        self.mode = mode
        self.filename = filename
        self.logging = logging
        self.handlers = handlers
        self.formatter = self.logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p')

    # 初始化五个方法：文件处理器方法 固定文件处理器 固定频率文件处理器 控制台处理器 日志器
    def __init_file_handler(self):
        file_handler = self.logging.FileHandler(filename=self.filename, mode='a', encoding='utf-8')  # 初始化
        file_handler.setFormatter(self.formatter)  # 设置格式
        file_handler.setLevel('INFO')  # 设定等级
        return file_handler

    def __init_rotating_file_handler(self):
        file_rotating_handler = self.handlers.RotatingFileHandler(
            filename=self.filename,
            mode='a',
            encoding='utf-8',
            maxBytes=1024*1024,  # 1mb = 1024b*1024
            backupCount=7  # 回滚次数
        )
        file_rotating_handler.setFormatter(self.formatter)
        file_rotating_handler.setLevel('INFO')
        return file_rotating_handler

    def __init_time_handler(self):
        file_time_handler = self.handlers.TimedRotatingFileHandler(
            filename=self.filename,
            when='h',  # 间隔单位
            interval=1,  # 间隔大小 合起来就是一小时
            backupCount=7
        )
        file_time_handler.setFormatter(self.formatter)
        file_time_handler.setLevel('INFO')
        return file_time_handler

    def __init_stream_handler(self):
        stream_handler = self.logging.StreamHandler(sys.stdout)
        stream_handler.setFormatter(self.formatter)
        stream_handler.setLevel('WARNING')
        return stream_handler

    def init_logger(self):
        logger = self.logging.getLogger(__name__)
        logger.setLevel('DEBUG')

        if handlers:
            if 's' in self.mode:
                logger.addHandler(self.__init_stream_handler())
            if 'f' in self.mode:
                if 'rf' in self.mode:
                    logger.addHandler(self.__init_rotating_file_handler())
                elif 'tf' in self.mode:
                    logger.addHandler(self.__init_time_handler())
                else:
                    logger.addHandler(self.__init_file_handler())
        return logger

